package e_Stream流.collect方法的使用;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 求集合中数据的最大、最小和平均值
 *
 * @author xuyaxu
 * @date 2022/8/28 12:06
 */
public class Demo1 {
    public static void main(String[] args) {
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4);

        // 求最大值
        Integer maxValue = integerList.stream().collect(Collectors.collectingAndThen(Collectors.maxBy((a, b) -> a - b), Optional::get));
        // 结果为：4
        System.out.println("最大值是：" + maxValue);

        // 求最小值
        Integer minValue = integerList.stream().collect(Collectors.collectingAndThen(Collectors.minBy((a, b) -> a - b), Optional::get));
        // 结果为：1
        System.out.println("最小值：" + minValue);

        // 求和 可以简化为：int sumValue = integerList.stream().mapToInt(item -> item).sum()
        Integer sumValue = integerList.stream().collect(Collectors.summingInt(item -> item));
        // 结果为：10
        System.out.println("求和：" + sumValue);

        // 平均值
        Double avg = integerList.stream().collect(Collectors.averagingDouble(x -> x));
        // 结果为：2.5
        System.out.println("平均值：" + avg);

        // 映射：先对集合中的元素进行映射，然后对映射的结果使用 Collectors 操作。可以简化为：Stream.of("a", "b", "c", "d").map(String::toUpperCase).collect(Collectors.joining(","))
        String mapValue = Stream.of("a", "b", "c", "d").collect(Collectors.mapping(x -> x.toUpperCase(), Collectors.joining(",")));
        // 结果：A,B,C,D
        System.out.println("大写：" + mapValue);
    }
}
